import collections
import datetime
import time
from django.shortcuts import render
from django.db.models import Count  # orm聚合条件
from django.http import JsonResponse
from django.db.models import Count
from web import models


def dashboard(request, project_id):
    """ 概览 """
    # 问题===========================================================================================
    # status_dict = {}
    status_dict = collections.OrderedDict()  # 有序字典 3.6 之前字典是无序的
    for key, text in models.Issues.status_choices:  # 循环所有的状态
        status_dict[key] = {'text': text, 'count': 0}
    # print(status_dict)  # 拿到所有的状态初始化

    # 问题的数据处理  【 根据status 分组     annotate(写分组后的聚合条件)
    issues_data = models.Issues.objects.filter(project_id=project_id).values('status').annotate(ct=Count('id'))
    # print(issues_data)  # <QuerySet [{'status': 3, 'ct': 1}, {'status': 2, 'ct': 1}, {'status': 5, 'ct': 2}, {'status': 1, 'ct': 2}]>

    for item in issues_data:
        # 把每个status 就是id  再在根据id到status_dict字典中找到对应的 在把count跟新成issues_data 对应的值
        status_dict[item['status']]['count'] = item['ct']
    # print(status_dict)

    # 项目成员========================================================================================
    # user_list = models.ProjectUser.objects.filter(project=request.bug_platform.project).values_list('user_id', 'user__username')
    # user_list = models.ProjectUser.objects.filter().values_list('user_id', 'user__username')
    user_list = models.ProjectUser.objects.filter(Project=request.bug_platform.project).values('user_id', 'user__username')  # 项目参与者

    # 动态========================================================================================
    # 最佳的10个问题  assign__isnull=False  assign 这个字段不能为空
    top_ten_object = models.Issues.objects.filter(project_id=project_id, assign__isnull=False).order_by('-id')[0:10]
    context = {
        'status_dict': status_dict,
        'user_list': user_list,
        'top_ten_object': top_ten_object
    }

    return render(request, 'dashboard.html', context)


def issues_chart(request, project_id):
    """ 在概览页面 问题趋势数据处理chart """
    # 最近30天，每天创建的问题数量

    # 去数据库中查询最近30天的所有数据 & 分组【根据日期每天问题数量分组
    today = datetime.datetime.now().date()  # datetime.date(2023, 3, 27) 年月日
    # today-datetime.timedelta(days=30)  今天为起始 往前推30天
    result = models.Issues.objects.filter(project_id=project_id, creator_datetime__gte=today - datetime.timedelta(days=30)).extra(  # 查询出来结果再最后再加一个字段数据
        # select={'ctime': 'strftime("%%Y-%%m-%%d", web_issues.creator_datetime)'}  # 新增一列ctime列 数据是根据数据库创建时间变成 年月日【 sqlite语法
        select={'ctime': 'DATE_FORMAT(web_issues.creator_datetime, "%%Y-%%m-%%d")'}  # 新增一列ctime列 数据是根据数据库创建时间变成 年月日【 mysql语法
    ).values('ctime').annotate(ct=Count('id'))
    # print(result)  # <QuerySet [{'ctime': '2023-03-18', 'ct': 1}, {'ctime': '2023-03-19', 'ct': 2}>
    # 返回给前端的数据
    # data_list = []
    # data_list: [
    #     [时间戳，问题数量],
    #     [时间戳，问题数量],
    #     [时间戳，问题数量],
    #     [时间戳，问题数量],
    # ]
    date_dict = collections.OrderedDict()  # 有序字典
    for i in range(0, 30):
        date = today - datetime.timedelta(days=i)  # 前30天的日期
        #  字典的key是当前时间格式（2023-03-19        将时间转换成时间戳（ 1679760000.0
        date_dict[date.strftime('%Y-%m-%d')] = [time.mktime(date.timetuple()) * 1000, 0]
    # print(date_dict)

    for item in result:
        date_dict[item['ctime']][1] = item['ct']

    data_list = list(date_dict.values())

    return JsonResponse({'status': True, 'data': data_list})
